package cn.iocoder.yudao.module.handguard.service.zoneprice;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.math.BigDecimal;
import java.util.*;
import cn.iocoder.yudao.module.handguard.controller.admin.zoneprice.vo.*;
import cn.iocoder.yudao.module.handguard.dal.dataobject.zoneprice.ZonePriceDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

import cn.iocoder.yudao.module.handguard.convert.zoneprice.ZonePriceConvert;
import cn.iocoder.yudao.module.handguard.dal.mysql.zoneprice.ZonePriceMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.handguard.enums.ErrorCodeConstants.*;


/**
 * 区域-小区-评估价记录 Service 实现类
 *
 * @author 超管
 */
@Service
@Validated
public class ZonePriceServiceImpl implements ZonePriceService {

    @Resource
    private ZonePriceMapper zonePriceMapper;

    @Override
    public Long createZonePrice(ZonePriceCreateReqVO createReqVO) {
        // 插入
        ZonePriceDO zonePrice = ZonePriceConvert.INSTANCE.convert(createReqVO);

        validateZonePriceByAreaAndCellName(createReqVO.getArea(), createReqVO.getCellName());

        zonePriceMapper.insert(zonePrice);
        // 返回
        return zonePrice.getId();
    }

    @Override
    public void updateZonePrice(ZonePriceUpdateReqVO updateReqVO) {
        // 校验存在

        validateZonePriceExists(updateReqVO.getId());
        ZonePriceDO priceDO = zonePriceMapper.selectById(updateReqVO.getId());
        if (priceDO.getCellName().equals(updateReqVO.getCellName()) && priceDO.getArea().equals(updateReqVO.getArea())) {
        }else {
            validateZonePriceByAreaAndCellName(updateReqVO.getArea(), updateReqVO.getCellName());
        }
        // 更新
        ZonePriceDO updateObj = ZonePriceConvert.INSTANCE.convert(updateReqVO);
        zonePriceMapper.updateById(updateObj);
    }

    @Override
    public void deleteZonePrice(Long id) {
        // 校验存在
        validateZonePriceExists(id);
        // 删除
        zonePriceMapper.deleteById(id);
    }

    private void validateZonePriceExists(Long id) {
        if (zonePriceMapper.selectById(id) == null) {
            throw exception(ZONE_PRICE_NOT_EXISTS);
        }
    }

    private void validateZonePriceByAreaAndCellName(String area,String cellName){
        // 判断如果不存在，在进行插入
        LambdaQueryWrapperX<ZonePriceDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.eq(ZonePriceDO::getArea,area);
        wrapperX.eq(ZonePriceDO::getCellName,cellName);
        ZonePriceDO existUser = zonePriceMapper.selectOne(wrapperX);
        if (existUser != null) {
            throw exception(ZONE_PRICE_IS_EXISTS);
        }
    }

    @Override
    public ZonePriceDO getZonePrice(Long id) {
        return zonePriceMapper.selectById(id);
    }

    @Override
    public List<ZonePriceDO> getZonePriceList(Collection<Long> ids) {
        return zonePriceMapper.selectBatchIds(ids);
    }

    @Override
    public String getZonePriceValuation(String area, String cellName) {
        // 判断如果不存在，在进行插入
        LambdaQueryWrapperX<ZonePriceDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.like(ZonePriceDO::getArea,area);
        wrapperX.eq(ZonePriceDO::getCellName,cellName);
        wrapperX.orderByDesc(ZonePriceDO::getCreateTime);
        List<ZonePriceDO> zonePriceDOList = zonePriceMapper.selectList(wrapperX);
        if (zonePriceDOList.size()>0){
            return String.valueOf(zonePriceDOList.get(0).getValuation());
        }
        return "";
    }

    @Override
    public PageResult<ZonePriceDO> getZonePricePage(ZonePricePageReqVO pageReqVO) {
        return zonePriceMapper.selectPage(pageReqVO);
    }

    @Override
    public List<ZonePriceDO> getZonePriceList(ZonePriceExportReqVO exportReqVO) {
        return zonePriceMapper.selectList(exportReqVO);
    }

    @Override
    public ZonePriceImportRespVO importUserList(List<ZonePriceImportExcelVO> importUsers, Boolean isUpdateSupport) {
        if (CollUtil.isEmpty(importUsers)) {
            throw exception(ZONE_PRICE_NOT_NULL);
        }
        ZonePriceImportRespVO respVO = ZonePriceImportRespVO.builder().createNames(new ArrayList<>())
                .updateNames(new ArrayList<>()).failureNames(new LinkedHashMap<>()).build();

        importUsers.forEach(importUser -> {
            // 判断如果不存在，在进行插入
            LambdaQueryWrapperX<ZonePriceDO> wrapperX = new LambdaQueryWrapperX<>();
            wrapperX.eq(ZonePriceDO::getArea,importUser.getArea());
            wrapperX.eq(ZonePriceDO::getCellName,importUser.getCellName());
            ZonePriceDO existUser = zonePriceMapper.selectOne(wrapperX);
            if (existUser == null) {
                ZonePriceDO insertZonePrice = new ZonePriceDO();
                BeanUtils.copyProperties(importUser, insertZonePrice);
                zonePriceMapper.insert(insertZonePrice);
                respVO.getCreateNames().add(importUser.getCellName());
            }else {
                ZonePriceDO updateZonePrice = new ZonePriceDO();
                BeanUtils.copyProperties(existUser, updateZonePrice);
                zonePriceMapper.updateById(updateZonePrice);
                respVO.getUpdateNames().add(importUser.getCellName());
            }
        });
        return respVO;
    }

    @Override
    public List<ZonePriceDO> getZonePriceListByAreaAndName(String area, String name) {
        // 判断如果不存在，在进行插入
        LambdaQueryWrapperX<ZonePriceDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.likeIfPresent(ZonePriceDO::getArea,area);
        wrapperX.likeIfPresent(ZonePriceDO::getCellName,name);
        //wrapperX.orderByDesc(ZonePriceDO::getCreateTime);
        List<ZonePriceDO> zonePriceDOList = zonePriceMapper.selectList(wrapperX);
        if (zonePriceDOList.size()>0){
            zonePriceDOList.forEach(z -> {
                z.setValuation(BigDecimal.ZERO);
            });
        }
        return zonePriceDOList;
    }

}
